home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / tcp_ip / jnos / jnos_src / mboxcmd.c < prev    next >
C/C++ Source or Header  |  1994-07-04  |  43KB  |  1,613 lines

  1. /* NOTE: because of size, the previous 'mailbox.c' has been
  2.  * split in 3 parts:
  3.  * mboxcmd.c, containing the 'mbox' subcommands,
  4.  * mailbox.c, containing some user mailbox commands, and
  5.  * mailbox2.c, containing the remaining user commands.
  6.  * 921125 - WG7J
  7.  */
  8. /* There are only two functions in this mailbox code that depend on the
  9.  * underlying protocol, namely mbx_getname() and dochat(). All the other
  10.  * functions can hopefully be used without modification on other stream
  11.  * oriented protocols than AX.25 or NET/ROM.
  12.  *
  13.  * SM0RGV 890506, most work done previously by W9NK
  14.  *
  15.  *** Changed 900114 by KA9Q to use newline mapping features in stream socket
  16.  *      interface code; everything here uses C eol convention (\n)
  17.  *
  18.  *      Numerous new commands and other changes by SM0RGV, 900120
  19.  *
  20.  * Gateway function now support outgoing connects with the user's call
  21.  * with inverted ssid. Users can connect to system alias as well...
  22.  * See also several mods in socket.c,ax25.c and others
  23.  * 11/15/91, WG7J/PA3DIS
  24.  *
  25.  * Userlogging, RM,VM and KM commands, and R:-line interpretation
  26.  * added 920307 and later, Johan. K. Reinalda, WG7J/PA3DIS
  27.  *
  28.  * Inactivity timeout-disconnect added 920325 and later - WG7J
  29.  *
  30.  */
  31. #ifdef MSDOS
  32. #include <io.h>
  33. #endif
  34. #include <time.h>
  35. #include <ctype.h>
  36. #ifdef MSDOS
  37. #include <alloc.h>
  38. #endif
  39. #include <time.h>
  40. #ifdef  UNIX
  41. #include <sys/types.h>
  42. #endif
  43. #include <sys/stat.h>
  44. #ifdef MSDOS
  45. #include <dir.h>
  46. #include <dos.h>
  47. #endif
  48. #include "global.h"
  49. #ifdef MAILBOX
  50. #include "timer.h"
  51. #include "proc.h"
  52. #include "socket.h"
  53. #include "usock.h"
  54. #include "session.h"
  55. #include "smtp.h"
  56. #include "dirutil.h"
  57. #include "telnet.h"
  58. #include "ftp.h"
  59. #include "ftpserv.h"
  60. #include "commands.h"
  61. #include "netuser.h"
  62. #include "files.h"
  63. #include "bm.h"
  64. #include "pktdrvr.h"
  65. #include "ax25.h"
  66. #include "mailbox.h"
  67. #include "ax25mail.h"
  68. #include "nr4mail.h"
  69. #include "cmdparse.h"
  70. #include "mailfor.h"
  71.   
  72. /*
  73. #define MBDEBUG
  74. */
  75.   
  76. extern int dombmovemail __ARGS((int argc,char *argv[],void *p));
  77. extern char Myalias[];
  78.   
  79. extern struct mbx *Mbox;
  80. extern int BbsUsers;
  81. extern int Totallogins;
  82. char *Mtmsg;
  83. #ifdef TTYLINKSERVER
  84. int MAttended = 0;
  85. #endif
  86. char Mbpasswd[MAXPWDLEN+1] = "";
  87.   
  88. #ifdef MBFWD
  89. char *Mbzip = NULLCHAR;
  90. char *Mbqth = NULLCHAR;
  91. char *Mbhaddress = NULLCHAR;
  92. char *Mbfwdinfo = NULLCHAR;
  93. int Mbsmtptoo = 0;
  94. int Mtrace = 0;
  95. #endif
  96.   
  97. extern int MbSent;
  98. extern int MbRead;
  99. extern int MbRecvd;
  100. #ifdef MBFWD
  101. extern int MbForwarded;
  102. #endif
  103.   
  104. #ifdef AX25
  105. static char Uplink[] =     "Uplink   (%s)";
  106. static char Downlink[] =   "Downlink (%s)";
  107. #endif
  108. #ifdef NETROM
  109. static char incircuit[]  = "Circuit  (%s%s%s %s)";
  110. static char outcircuit[] = "Circuit  (%s%s%s)";
  111. #endif
  112. static char Telnet[] =     "Telnet   (%s @ %s)";
  113. static char Telnetdown[] = "Telnet   (%s)";
  114. static char Local[] =      "Local    (%s)";
  115.   
  116. static int doattend __ARGS((int argc,char *argv[],void *p));
  117. int dombusers __ARGS((int argc,char *argv[],void *p));
  118. static int dombpast __ARGS((int argc,char *argv[],void *p));
  119. #ifdef MAILBOX
  120. #if ((defined AX25) || (defined NETROM))
  121. static int dombnrid __ARGS((int argc,char *argv[],void *p));
  122. #endif
  123. #endif
  124. static int dombpasswd __ARGS((int argc,char *argv[],void *p));
  125. static int dombsecure __ARGS((int argc,char *argv[],void *p));
  126. static int dombtrace __ARGS((int argc,char *argv[],void *p));
  127. static int dombzipcode __ARGS((int argc,char *argv[],void *p));
  128. static int dombfwdinfo __ARGS((int argc,char *argv[],void *p));
  129. static int dombqth __ARGS((int argc,char *argv[],void *p));
  130. static int dombhaddress __ARGS((int argc,char *argv[],void *p));
  131. static int dombsmtptoo __ARGS((int argc,char *argv[],void *p));
  132. static int dombutc __ARGS((int argc,char *argv[],void *p));
  133. extern int dombmailfor __ARGS((int argc,char *argv[],void *p));
  134. extern int dombstatus __ARGS((int argc,char *argv[],void *p));
  135. int dombmailstats __ARGS((int argc,char *argv[],void *p));
  136. static int dombtdisc __ARGS((int argc,char *argv[],void *p));
  137. static int dombtmsg __ARGS((int argc,char *argv[],void *p));
  138. static int dombconvers __ARGS((int argc,char *argv[],void *p));
  139. static int dombsendquery __ARGS((int argc,char *argv[],void *p));
  140. static int dombmport __ARGS((int argc,char *argv[],void *p));
  141. static int dombnewmail __ARGS((int argc,char *argv[],void *p));
  142. static int dombhideport __ARGS((int argc,char *argv[],void *p));
  143. static int dombheader __ARGS((int argc,char *argv[],void *p));
  144. static int dombnobid __ARGS((int argc,char *argv[],void *p));
  145. static int dombnoax25 __ARGS((int argc,char *argv[],void *p));
  146. static int dombbonly __ARGS((int argc,char *argv[],void *p));
  147. static int dombuonly __ARGS((int argc,char *argv[],void *p));
  148. static int dombsonly __ARGS((int argc,char *argv[],void *p));
  149. static int dombregister __ARGS((int argc,char *argv[],void *p));
  150. static int dombshowalias __ARGS((int argc,char *argv[],void *p));
  151. static struct pu *pu_lookup __ARGS((char *name));
  152.   
  153. int Usenrid;
  154. int MBSecure;
  155.   
  156. #ifdef REGISTER
  157. int MbRegister = 1;
  158. #endif
  159.   
  160. #ifdef MAILCMDS
  161. int Mbsendquery = 1;
  162. int NoBid;
  163. #ifdef USERLOG
  164. int Mbnewmail = 1;
  165. #endif
  166. #endif
  167.   
  168. int32 Mbtdiscinit;
  169.   
  170. /* mbox subcommand table */
  171. static struct cmds DFAR Mbtab[] = {
  172.     "alias",        doaliases,      0, 0, NULLCHAR,
  173. #ifdef TTYLINKSERVER
  174.     "attend",       doattend,       0, 0, NULLCHAR,
  175. #endif
  176. #ifdef CONVERS
  177.     "convers",  dombconvers,0, 0, NULLCHAR,
  178. #endif
  179. #ifdef MAILCMDS
  180. #ifdef MBFWD
  181.     "fwdinfo",  dombfwdinfo,0, 0, NULLCHAR,
  182.     "haddress", dombhaddress,0,0, NULLCHAR,
  183.     "header",   dombheader, 0, 0, NULLCHAR,
  184. #endif
  185. #endif
  186. #ifdef AX25
  187.     "hideport", dombhideport, 0,0, NULLCHAR,
  188. #ifdef MAILCMDS
  189. #ifdef MBFWD
  190. #ifdef RLINE
  191.     "kick",     dombkick,   0, 0, NULLCHAR,
  192. #endif
  193. #endif
  194. #endif
  195. #endif
  196. #ifdef MAILCMDS
  197. #ifdef MAILFOR
  198. #ifdef AX25
  199.     "mailfor",  dombmailfor,0, 0, NULLCHAR,
  200. #endif
  201. #endif
  202. #ifdef AX25
  203.     "mport",    dombmport,  0, 0, NULLCHAR,
  204. #ifdef USERLOG
  205.     "newmail",  dombnewmail,0, 0, NULLCHAR,
  206. #endif
  207. #endif /* MAILCMDS */
  208.     "nobid",  dombnobid,  0, 0, NULLCHAR,
  209. #ifdef AX25
  210.     "nrid",     dombnrid,   0, 0, NULLCHAR,
  211. #endif
  212. #endif
  213.     "past",     dombpast,   0, 0, NULLCHAR,
  214.     "password", dombpasswd, 0, 0, NULLCHAR,
  215. #ifdef MAILCMDS
  216.     "mailstats",dombmailstats,0,0,NULLCHAR,
  217. #ifdef MBFWD
  218.     "qth",      dombqth,    0, 0, NULLCHAR,
  219. #endif
  220. #ifdef REGISTER
  221.     "register", dombregister,0, 0,NULLCHAR,
  222. #endif
  223. #endif /* MAILCMDS */
  224.     "secure",   dombsecure, 0, 0, NULLCHAR,
  225. #ifdef MAILCMDS
  226.     "sendquery",dombsendquery,0,0,NULLCHAR,
  227. #ifdef MBFWD
  228.     "smtptoo",  dombsmtptoo,0, 0, NULLCHAR,
  229. #endif
  230. #endif
  231.     "status",   dombstatus,  0, 0, NULLCHAR,
  232.     "showalias",dombshowalias,0,0, NULLCHAR,
  233. #ifdef MAILCMDS
  234. #ifdef  AX25
  235. #ifdef MBFWD
  236.     "timer",        dombtimer,      0, 0, NULLCHAR,
  237. #endif
  238. #endif
  239. #endif
  240.     "tdisc",    dombtdisc,  0, 0, NULLCHAR,
  241.     "tmsg",     dombtmsg,   0, 0, NULLCHAR,
  242. #ifdef MAILCMDS
  243. #ifdef MBFWD
  244.     "trace",    dombtrace,  0, 0, NULLCHAR,
  245.     "utc",      dombutc,    0, 0, NULLCHAR,
  246.     "zipcode",  dombzipcode,0, 0, NULLCHAR,
  247. #endif
  248. #endif
  249.     "noax25",   dombnoax25, 0, 0, NULLCHAR,
  250.     "bbsonly",  dombbonly,  0, 0, NULLCHAR,
  251.     "usersonly",dombuonly,  0, 0, NULLCHAR,
  252.     "sysoponly",dombsonly, 0, 0, NULLCHAR,
  253.     NULLCHAR,
  254. };
  255.   
  256. struct alias *AliasList;
  257.   
  258. // add aliases to the list
  259. int
  260. doaliases(int argc,char *argv[],void *p) {
  261.     struct alias *a;
  262.     int len;
  263.   
  264.     if(argc < 2)    // show the aliases
  265.         return dombalias(0,NULL,NULL);
  266.   
  267.     if(argc == 2) {  // show a single alias, if any
  268.         for(a=AliasList;a;a=a->next)
  269.             if(!stricmp(a->name,argv[1])) {
  270.                 tprintf("%s\n",a->cmd);
  271.                 break;
  272.             }
  273.         if(!a)
  274.             tputs("not set!\n");
  275.         return 0;
  276.     }
  277.   
  278.     // now either delete or add an alias !
  279.     if((len=strlen(argv[2])) == 0) {  // delete an alias
  280.         struct alias *p = NULL;
  281.   
  282.         for(a=AliasList;a;p=a,a=a->next) {
  283.             if(!stricmp(a->name,argv[1])) {
  284.                 if(p)
  285.                     p->next = a->next;
  286.                 else
  287.                     AliasList = a->next;
  288.                 free(a->name);
  289.                 free(a->cmd);
  290.                 free(a);
  291.                 break;
  292.             }
  293.         }
  294.     } else {    // add a new alias or change an existing one
  295.         if(len > MBXLINE) {
  296.             puts("Alias too long!\n");
  297.             return 1;
  298.         }
  299.         for(a=AliasList;a;a=a->next)
  300.             if(!stricmp(a->name,argv[2]))
  301.                 break;
  302.         if(!a) {    // add a new one
  303.             a = mallocw(sizeof(struct alias));
  304.             a->next = AliasList;
  305.             AliasList = a;
  306.             a->name = strdup(argv[1]);
  307.             strupr(a->name);
  308.         } else
  309.             free(a->cmd);
  310.         a->cmd = strdup(argv[2]);
  311.     }
  312.     return 0;
  313. }
  314.   
  315.   
  316. int
  317. dombalias(int argc,char *argv[],void *p) {
  318.     struct alias *a;
  319.   
  320.     for(a=AliasList;a;a=a->next)
  321.         if(tprintf("%s: %s\n",a->name,a->cmd) == EOF)
  322.             return EOF;
  323.     return 0;
  324. }
  325.   
  326. struct alias *findalias(char *cmd) {
  327.     struct alias *a;
  328.   
  329.     // check with the alias list
  330.     for(a=AliasList;a;a=a->next)
  331.         if(!stricmp(a->name,cmd))
  332.             break;
  333.     return a;
  334. }
  335.   
  336.   
  337. char Mbnrid[20];
  338.   
  339. /*set the mailbox netrom id*/
  340. void
  341. setmbnrid() {
  342.     char tmp[AXBUF];
  343.     char tmp2[AXBUF];
  344. #ifndef AX25
  345.     char *cp;
  346. #endif
  347.   
  348. #ifdef NETROM
  349.     if(Nr_iface != NULLIF) { /* Use netrom call, and alias (if exists) */
  350.         if(*Myalias != '\0')
  351.             sprintf(Mbnrid,"%s:%s ",pax25(tmp,Myalias),
  352.             pax25(tmp2,Nr_iface->hwaddr));
  353.         else
  354.             sprintf(Mbnrid,"%s ",pax25(tmp,Nr_iface->hwaddr));
  355.         return;
  356.     }
  357.     /* Use Mycall, and alias (if exists) */
  358.     if(*Myalias != '\0')
  359.         sprintf(Mbnrid,"%s:%s ",pax25(tmp,Myalias),pax25(tmp2,Mycall));
  360.     else
  361. #endif
  362. #ifdef AX25
  363.         sprintf(Mbnrid,"%s ",pax25(tmp,Mycall));
  364. #else
  365.     strncpy(Mbnrid,Hostname,19);
  366.     if((cp = strchr(Mbnrid,'.')) != NULLCHAR)
  367.         *cp = '\0';
  368. #endif
  369.     return;
  370. }
  371.   
  372. /*This is a dummy called from the main command interpreter,
  373.  *setup a mbx structure so dombusers() works correct - WG7J
  374.  */
  375. int
  376. dombstatus(argc,argv,p)
  377. int argc;
  378. char *argv[];
  379. void *p;
  380. {
  381.     struct mbx m;
  382.   
  383.     m.privs = SYSOP_CMD;
  384.     m.stype = ' ';
  385.     return dombusers(0,NULL,&m);
  386. }
  387.   
  388. int
  389. dombox(argc,argv,p)
  390. int argc;
  391. char *argv[];
  392. void *p;
  393. {
  394.     if(argc == 1)
  395.         return dombstatus(0,NULL,NULL);
  396.     return subcmd(Mbtab,argc,argv,p);
  397. }
  398.   
  399. #ifdef REGISTER
  400. static int
  401. dombregister(argc,argv,p)
  402. int argc;
  403. char *argv[];
  404. void *p;
  405. {
  406.     return setbool(&MbRegister,"registration",argc,argv);
  407. }
  408. #endif
  409.   
  410. #ifdef AX25
  411.   
  412. static int
  413. dombhideport(int argc, char *argv[], void *p)
  414. {
  415.     return setflag(argc,argv[1],HIDE_PORT,argv[2]);
  416. }
  417.   
  418. static int
  419. dombnrid(argc,argv,p)
  420. int argc;
  421. char *argv[];
  422. void *p;
  423. {
  424.     return setbool(&Usenrid,"Netrom id prompt",argc,argv);
  425. }
  426.   
  427. #ifdef MAILCMDS
  428. static int
  429. dombmport(argc,argv,p)
  430. int argc;
  431. char *argv[];
  432. void *p;
  433. {
  434.     return setflag(argc,argv[1],MAIL_BEACON,argv[2]);
  435. }
  436. #endif
  437. #endif /* AX25 */
  438.   
  439. #ifdef MAILCMDS
  440.   
  441. static int
  442. dombnobid(argc,argv,p)
  443. int argc;
  444. char *argv[];
  445. void *p;
  446. {
  447.     return setbool(&NoBid,"Accept Buls without BID",argc,argv);
  448. }
  449.   
  450. static int
  451. dombsendquery(argc,argv,p)
  452. int argc;
  453. char *argv[];
  454. void *p;
  455. {
  456.     return setbool(&Mbsendquery,"query after send",argc,argv);
  457. }
  458.   
  459. #ifdef USERLOG
  460.   
  461. static int
  462. dombnewmail(argc,argv,p)
  463. int argc;
  464. char *argv[];
  465. void *p;
  466. {
  467.     return setbool(&Mbnewmail,"show new area mail",argc,argv);
  468. }
  469. #endif
  470. #endif
  471.   
  472. #ifdef CONVERS
  473. int Mbconverse = 1;
  474.   
  475. static int
  476. dombconvers(argc,argv,p)
  477. int argc;
  478. char *argv[];
  479. void *p;
  480. {
  481.     return setbool(&Mbconverse,"Mbox convers",argc,argv);
  482. }
  483. #endif
  484.   
  485. #ifdef TTYLINKSERVER
  486. /* if unattended mode is set, ax25, telnet and maybe other sessions will
  487.  * be restricted.
  488.  */
  489. static int
  490. doattend(argc,argv,p)
  491. int argc;
  492. char *argv[];
  493. void *p;
  494. {
  495.     return setbool(&MAttended,"Mailbox Attended flag",argc,argv);
  496. }
  497. #endif
  498.   
  499. /* Set mailbox redundancy timer */
  500. static int
  501. dombtdisc(argc,argv,p)
  502. int argc;
  503. char *argv[];
  504. void *p;
  505. {
  506.     return setlong(&Mbtdiscinit,"Mbox redundancy timer (sec)",argc,argv);
  507. }
  508.   
  509. #ifdef MAILCMDS
  510. #ifdef MBFWD
  511. int Mbheader;
  512.   
  513. extern int ThirdParty;
  514.   
  515. static int
  516. dombheader(argc,argv,p)
  517. int argc;
  518. char *argv[];
  519. void *p;
  520. {
  521.     int retval;
  522.   
  523.     retval = setbool(&Mbheader,"R: header",argc,argv);
  524.     if(!Mbheader)
  525.         ThirdParty = 0;
  526.     return retval;
  527. }
  528.   
  529. static int
  530. dombsmtptoo(argc,argv,p)
  531. int argc;
  532. char *argv[];
  533. void *p;
  534. {
  535.     return setbool(&Mbsmtptoo,"Bbs forwards SMTP headers",argc,argv);
  536. }
  537. #endif
  538. #endif
  539.   
  540. static int
  541. dombpasswd(argc,argv,p)
  542. int argc;
  543. char *argv[];
  544. void *p;
  545. {
  546.     int len;
  547.   
  548.     /*Only allowed from keyboard*/
  549.     if(Curproc->input != Command->input) {
  550.         tputs(Noperm);
  551.         return 0;
  552.     }
  553.     if(argc != 2) {
  554.         tputs("Usage: mbox password \"<sysop password>\"\n");
  555.         return 0;
  556.     }
  557.     if((len=strlen(argv[1])) == 0)
  558.         return 0;       /* zero length, don't reset */
  559.   
  560.     if(len > MAXPWDLEN) {
  561.         tputs("Too long\n");
  562.         return 0;
  563.     }
  564.     strcpy(Mbpasswd,argv[1]);
  565.     return 0;
  566. }
  567.   
  568. static int
  569. dombtmsg(argc,argv,p)
  570. int argc;
  571. char *argv[];
  572. void *p;
  573. {
  574.     if(argc > 2) {
  575.         tputs("Usage: mbox tmsgs \"<your message>\"\n");
  576.         return 0;
  577.     }
  578.   
  579.     if(argc < 2) {
  580.         if(Mtmsg != NULLCHAR)
  581.             tputs(Mtmsg);
  582.     }
  583.     else {
  584.         if(Mtmsg != NULLCHAR){
  585.             free(Mtmsg);
  586.             Mtmsg = NULLCHAR;   /* reset the pointer */
  587.         }
  588.         if(!strlen(argv[1]))
  589.             return 0;               /* clearing the buffer */
  590.         Mtmsg = mallocw(strlen(argv[1])+5);/* allow for the EOL char */
  591.         strcpy(Mtmsg, argv[1]);
  592.         strcat(Mtmsg, "\n");        /* add the EOL char */
  593.     }
  594.     return 0;
  595. }
  596.   
  597. #ifdef MAILCMDS
  598. #ifdef MBFWD
  599. signed int UtcOffset=0;
  600.   
  601. /*Set the difference between Local time, and UTC !*/
  602. static int
  603. dombutc(argc,argv,p)
  604. int argc;
  605. char *argv[];
  606. void *p;
  607. {
  608.     if(argc < 2) {
  609.         tputs("Local Time is UTC");
  610.         if(UtcOffset == 0)
  611.             tputc('\n');
  612.         else {
  613.             if(UtcOffset > 0)
  614.                 tputc('+');
  615.             tprintf("%d\n",UtcOffset);
  616.         }
  617.         return 0;
  618.     }
  619.     UtcOffset = atoi(argv[1]);
  620.     return 0;
  621. }
  622.   
  623. /*Set the ZIP to be used in the R: line when forwarding */
  624. static int
  625. dombzipcode(argc,argv,p)
  626. int argc;
  627. char *argv[];
  628. void *p;
  629. {
  630.     int len;
  631.   
  632.     if(argc > 2) {
  633.         tputs("Usage: mbox zipcode <your zip>\n");
  634.         return 0;
  635.     }
  636.   
  637.     if(argc < 2) {
  638.         if(Mbzip != NULLCHAR)
  639.             tprintf("%s\n",Mbzip);
  640.     }
  641.     else {
  642.         len = strlen(argv[1]);
  643. #ifdef notdef
  644.     /*check for a valid zip - this is for USA only!!! - WG7J*/
  645.         if( (len != 5) || !(atol(argv[1])) ){
  646.             tprintf("%s: Invalid, should be 5 digits!\n",argv[1]);
  647.             return 0;
  648.         }
  649. #endif
  650.         if(Mbzip != NULLCHAR){
  651.             free(Mbzip);
  652.             Mbzip = NULLCHAR;   /* reset the pointer */
  653.         }
  654.         if(len == 0)
  655.             return 0;               /* clearing the buffer */
  656.         Mbzip = mallocw(len+1); /* room for \0 */
  657.         strcpy(Mbzip, argv[1]);
  658.     }
  659.     return 0;
  660. }
  661.   
  662. /* Set the QTH to be used in R: line when forwarding*/
  663. static int
  664. dombqth(argc,argv,p)
  665. int argc;
  666. char *argv[];
  667. void *p;
  668. {
  669.     if(argc > 2) {
  670.         tputs("Usage: mbox qth <your qth> || \"<your qth, state>\"\n");
  671.         return 0;
  672.     }
  673.   
  674.     if(argc < 2) {
  675.         if(Mbqth != NULLCHAR)
  676.             tprintf("%s\n",Mbqth);
  677.     }
  678.     else {
  679.         if(Mbqth != NULLCHAR){
  680.             free(Mbqth);
  681.             Mbqth = NULLCHAR;   /* reset the pointer */
  682.         }
  683.         if(!strlen(argv[1]))
  684.             return 0;               /* clearing the buffer */
  685.         Mbqth = mallocw(strlen(argv[1]) + 1);
  686.         strcpy(Mbqth, argv[1]);
  687.     }
  688.     return 0;
  689. }
  690.   
  691. /*Set the hierachical address to be used in R: line when forwarding*/
  692. static int
  693. dombhaddress(argc,argv,p)
  694. int argc;
  695. char *argv[];
  696. void *p;
  697. {
  698.     if(argc > 2) {
  699.         tputs("Usage: mbox haddress <your H-address (WITH call)>\n");
  700.         return 0;
  701.     }
  702.   
  703.     if(argc < 2) {
  704.         if(Mbhaddress != NULLCHAR)
  705.             tprintf("%s\n",Mbhaddress);
  706.     }
  707.     else {
  708.         if(Mbhaddress != NULLCHAR){
  709.             free(Mbhaddress);
  710.             Mbhaddress = NULLCHAR;   /* reset the pointer */
  711.         }
  712.         if(!strlen(argv[1]))
  713.             return 0;               /* clearing the buffer */
  714.         Mbhaddress = mallocw(strlen(argv[1]) + 1);
  715.         strcpy(Mbhaddress, argv[1]);
  716.     /*make sure the're upper case*/
  717.         strupr(Mbhaddress);
  718.     }
  719.     return 0;
  720. }
  721.   
  722. /*Set the R: line [info] to be used when forwarding*/
  723. static int
  724. dombfwdinfo(argc,argv,p)
  725. int argc;
  726. char *argv[];
  727. void *p;
  728. {
  729.     if(argc > 2) {
  730.         tputs("Usage: mbox fwdinfo \"<your R:-line [info]>\"\n");
  731.         return 0;
  732.     }
  733.   
  734.     if(argc < 2) {
  735.         if(Mbfwdinfo != NULLCHAR)
  736.             tprintf("%s\n",Mbfwdinfo);
  737.     }
  738.     else {
  739.         if(Mbfwdinfo != NULLCHAR){
  740.             free(Mbfwdinfo);
  741.             Mbfwdinfo = NULLCHAR;   /* reset the pointer */
  742.         }
  743.         if(!strlen(argv[1]))
  744.             return 0;               /* clearing the buffer */
  745.         Mbfwdinfo = mallocw(strlen(argv[1]) + 1);
  746.         strcpy(Mbfwdinfo, argv[1]);
  747.     }
  748.     return 0;
  749. }
  750. #endif /*MBFWD*/
  751. #endif
  752.   
  753. /* Keep track of all past users */
  754. struct pu {
  755.     struct pu *next;    /* next one in list */
  756.     char name[20];              /* user name */
  757. #ifdef notdef
  758.     int family;                 /* how did user come in last */
  759. #endif
  760.     int32 time;                 /* When was the last login ? */
  761.     int number;                 /* Number of times logged in */
  762. };
  763. #define NULLPU (struct pu *)NULL
  764. struct pu *Pu = NULLPU;
  765.   
  766. /* Look up an entry in the users-list*/
  767. static
  768. struct pu *
  769. pu_lookup(name)
  770. char *name;
  771. {
  772.     struct pu *ppu;
  773.     struct pu *pulast = NULLPU;
  774.   
  775.     for(ppu = Pu;ppu != NULLPU;pulast = ppu,ppu = ppu->next){
  776.         if(!strcmp(name,ppu->name)){ /* found it! */
  777.             if(pulast != NULLPU){
  778.                 /* Move entry to top of list */
  779.                 pulast->next = ppu->next;
  780.                 ppu->next = Pu;
  781.                 Pu = ppu;
  782.             }
  783.             return ppu;
  784.         }
  785.     }
  786.     return NULLPU;
  787. }
  788.   
  789. /*Log all users of the mailbox*/
  790. /* This gets kept track of in the file name UDefaults */
  791. /* format is
  792. user datestamp options
  793. where options are separated by spaces
  794. M# - use more with # lines
  795. A - use area indiation
  796. X - use expert status
  797. N - use netrom lookalike prompt
  798. R - send 'reply-to' header with mail
  799. */
  800.   
  801. #ifdef USERLOG
  802.   
  803. /* Write the new defaults - WG7J */
  804. void
  805. updatedefaults(m)
  806. struct mbx *m;
  807. {
  808.     FILE *Ufile, *tfile;
  809.     char buf[256];
  810.     char *cp;
  811.     time_t t;
  812.   
  813.     /* Save old defaults file to backup */
  814.     unlink(UDefbak);
  815.     if(rename(UDefaults,UDefbak))
  816.         return;
  817.   
  818.     /*Write all users back, but update this one!*/
  819.     if((Ufile = fopen(UDefaults,"w")) == NULLFILE) {
  820.         /* Can't create defaults file ??? */
  821.         rename(UDefbak,UDefaults);  /* undo */
  822.         return;
  823.     }
  824.   
  825.     if((tfile = fopen(UDefbak,"r")) == NULLFILE) {
  826.         /* What on earth happened ???? */
  827.         fclose(Ufile);
  828.         unlink(UDefaults);
  829.         rename(UDefbak,UDefaults);  /* undo */
  830.         return;
  831.     }
  832.     while(fgets(buf,sizeof(buf),tfile) != NULLCHAR) {
  833.         if((cp=strchr(buf,' ')) != NULLCHAR)
  834.             *cp = '\0';
  835.         if(!stricmp(m->name,buf)) {
  836.             /*found this user*/
  837.             time(&t);
  838.             /* KF5MG
  839.                the -n , -h and -e flags are for Name and Homebbs and email.
  840.                Existing USER.DAT files should work. No -n, -h or -e will be
  841.                found, so defauls will be used. The REGISTER command updates
  842.                the username and homebbs fields.
  843.             */
  844.             sprintf(buf,"%s %lu M%d %c %c %c %c -n%s -h%s -e%s C%c\n",
  845.             m->name,t,m->morerows,
  846.             (m->sid&MBX_REPLYADDR) ? 'R' : ' ',
  847.             (m->sid&MBX_AREA) ? 'A' : ' ' ,
  848.             (m->sid&MBX_EXPERT) ? 'X' : ' ' ,
  849.             (m->sid&MBX_NRID) ? 'N' : ' ',
  850.             m->username?m->username : "",
  851.             m->homebbs ? m->homebbs : "",
  852.             m->IPemail ? m->IPemail : "",
  853.             (m->family == AF_AX25) ? 'A' : \
  854.             ((m->family == AF_NETROM) ? 'N' : 'T'));
  855.         } else
  856.             *cp = ' '; /* restore the space !*/
  857.         fputs(buf,Ufile);
  858.     }
  859.     fclose(tfile);
  860.     fclose(Ufile);
  861.     return;
  862. }
  863.   
  864. #ifdef MAILCMDS
  865. /* scan the areas file, looking for those with datestamps > m->last.
  866.  * these are areas that have new mail received since the user
  867.  * last logged in. - WG7J/N5KNX
  868.  */
  869. void listnewmail(struct mbx *m,int silent) {
  870.     FILE *fp;
  871.     char buf[LINELEN], path[FILE_PATH_SIZE];
  872.     struct stat statbuf;
  873.     long t;
  874.     int rval;
  875.     int firstone=1, column=0;
  876.  
  877.     if((fp = fopen(Arealist,READ_TEXT)) == NULLFILE)
  878.         return;
  879.     while(fgets(buf,sizeof(buf),fp) != NULLCHAR) {
  880.         pwait(NULL);
  881.         /* The first word on each line is all that matters */
  882.         firsttoken(buf);
  883.         dirformat(buf);
  884.     sprintf(path,"%s/%s.inf", Mailspool, buf);
  885.     dotformat(buf);
  886.     if ((rval = open(path, READBINARY)) == -1)
  887.          continue;
  888.     if (fstat(rval, &statbuf) != -1) {
  889.         /* Is there new mail here ? */
  890.             if(m->last < statbuf.st_mtime) {
  891.             if(firstone) {
  892.                      tprintf("New mail in: %s  ",buf);
  893.                      firstone = 0;
  894.                      column = 2;
  895.                 } else {
  896.                     tprintf("%s  ",buf);
  897.                     if(column++ == 6)
  898.                         tputc('\n');
  899.                 }
  900.             }
  901.     }
  902.     close(rval);
  903.     }
  904.     fclose(fp);
  905.     if(!firstone)
  906.         tputc('\n');
  907.     else if(!silent)
  908.         tputs("No new bulletins since last login\n");
  909.     return;
  910. }
  911. #endif MAILCMDS
  912.   
  913. #endif /* USERLOG */
  914.   
  915. int DiffUsers;
  916.   
  917. void
  918. loguser(m)
  919. struct mbx *m;
  920. {
  921.     struct pu *pu;
  922. #ifdef USERLOG
  923.     FILE *Ufile;
  924.     char buf[256];
  925.     char *cp,*cp2;
  926.     int found=0;
  927.     int xpert = 0;
  928. #endif
  929.   
  930.     if((pu = pu_lookup(m->name)) == NULLPU) {   /* not 'known' user */
  931.         pu = (struct pu *)callocw(1,sizeof(struct pu));
  932.         strcpy(pu->name,m->name);
  933.         pu->next = Pu;
  934.         Pu = pu;
  935.         DiffUsers++;    /* A new guy */
  936.     }
  937. #ifdef notdef
  938.     pu->family = m->family;
  939. #endif
  940.     pu->time = secclock();
  941.     pu->number++;
  942.   
  943. #ifdef USERLOG
  944.     /* In case these are already set, clear them */
  945.     free(m->homebbs);
  946.     free(m->IPemail);
  947.     free(m->username);
  948.     m->username = m->IPemail = m->homebbs = NULLCHAR;
  949.   
  950.     /* Now get options from the userdefaults file, and add timestamp */
  951.     if(!(m->sid&MBX_SID)) { /* only if not a bbs */
  952.         sprintf(buf,"%s",UDefaults);
  953.         if ((Ufile = fopen(buf,"r+")) == NULLFILE) {
  954.             /* default file doesn't exist, create it */
  955.             if((Ufile = fopen(buf,"w")) == NULLFILE)
  956.                 return;
  957.             /* Add this user as first one */
  958.             sprintf(buf,"%s 0 M%d A %c %c C%c\n",
  959.             m->name,m->morerows,
  960.             (m->sid&MBX_EXPERT) ? 'X' : ' ' ,
  961.             (m->sid&MBX_NRID) ? 'N' : ' ',
  962.             (m->family == AF_AX25) ? 'A' : \
  963.             ((m->family == AF_NETROM) ? 'N' : 'T'));
  964.             fputs(buf,Ufile);
  965.             fclose(Ufile);
  966.             m->sid |= MBX_AREA;
  967.             m->last = 0L;
  968.             if(Usenrid)
  969.                 m->sid |= MBX_NRID;
  970.             return;
  971.         }
  972.         /* Find user in the default file */
  973.         while(!found) {
  974.             if(fgets(buf,sizeof(buf),Ufile) == NULLCHAR)
  975.                 break;
  976.             /* single out the name */
  977.             if((cp=strchr(buf,' ')) != NULLCHAR)
  978.                 *cp++ = '\0';
  979.             /* compare the name */
  980.             if(!stricmp(m->name,buf)) {
  981.                 /* found user, now scan the options used */
  982.                 found = 1;
  983.                 fclose(Ufile);
  984.                 /* first read last login time */
  985.                 m->last = atol(cp);
  986.                 while(*cp != '\0') {
  987.                     while(*cp == ' ')   /*skip blanks*/
  988.                         cp++;
  989.                     switch(*cp){
  990.                         case 'C':
  991.                         /* All options end BEFORE the CT/CN or CA */
  992.                             *(cp+1) = '\0';
  993.                             break;
  994.                         case 'R':
  995.                             m->sid |= MBX_REPLYADDR;
  996.                             break;
  997.                         case 'M':
  998.                             cp++;
  999.                             m->morerows = atoi(cp);
  1000.                             break;
  1001.                         case 'A':
  1002.                             m->sid |= MBX_AREA;
  1003.                             break;
  1004.                         case 'X':
  1005.                             m->sid |= MBX_EXPERT;
  1006.                             xpert = 1;
  1007.                             break;
  1008.                         case 'N':
  1009.                             m->sid |= MBX_NRID;
  1010.                             break;
  1011.                         case '-':
  1012.                             cp++;
  1013.                             cp2 = cp++;     /* cp2 point to option,
  1014.                                          * cp to beginning of option-data */
  1015.                             while(*cp != ' ')   /* find end of option-data */
  1016.                                 cp++;
  1017.                             *cp = '\0';
  1018.                             switch(*cp2++){
  1019.                                 case 'h':
  1020.                                     if(*cp2)
  1021.                                         m->homebbs  = strdup(cp2);
  1022.                                     break;
  1023.                                 case 'e':
  1024.                                     if(*cp2)
  1025.                                         m->IPemail  = strdup(cp2);
  1026.                                     break;
  1027.                                 case 'n':
  1028.                                     if(*cp2)
  1029.                                         m->username = strdup(cp2);
  1030.                                     break;
  1031.                             }
  1032.                             break;
  1033.                     }
  1034.                     cp++;
  1035.                 }
  1036.             }
  1037.         } /* while(!found)*/
  1038.         if(found) {
  1039.             /* add the new timestamp to the defaults file */
  1040.             if(!xpert)
  1041.                 m->sid &= ~MBX_EXPERT;
  1042.         } else {
  1043.             /* a new one, add to the end (where we now should be!)*/
  1044.             m->last = 0L;
  1045.             sprintf(buf,"%s 0 M%d A %c %c C%c\n",
  1046.             m->name,m->morerows,
  1047.             (m->sid & MBX_EXPERT) ? 'X' : ' ' ,
  1048.             (Usenrid) ? 'N' : ' ' ,
  1049.             (m->family == AF_AX25) ? 'A' : \
  1050.             ((m->family == AF_NETROM) ? 'N' : 'T'));
  1051.             fputs(buf,Ufile);
  1052.             fclose(Ufile);
  1053.             m->sid |= MBX_AREA;
  1054.             if(Usenrid)
  1055.                 m->sid |= MBX_NRID;
  1056.         }
  1057.     }/* if not bbs */
  1058. #endif /* USERLOG */
  1059.   
  1060. }
  1061.   
  1062. /*List all past users of the mailbox */
  1063. static int
  1064. dombpast(argc,argv,p)
  1065. int argc;
  1066. char *argv[];
  1067. void *p;
  1068. {
  1069.   
  1070.     struct pu *pu;
  1071.     int col = 0;
  1072.     int max=10000;      /* Large enough :-) */
  1073.     int count=0;
  1074.   
  1075.     if(argc>1)
  1076.         max = atoi(argv[1])-1;
  1077.   
  1078.     tputs("Past users:\n"
  1079.     "User       Logins  Time since last   "
  1080.     "User       Logins  Time since last\n");
  1081.     for (pu=Pu;pu!=NULLPU;pu=pu->next) {
  1082.         if(col)
  1083.             tputs(" : ");
  1084.         tprintf("%-10s    %-4d    %12s",pu->name,pu->number,\
  1085.         tformat(secclock() - pu->time));
  1086.         count++;
  1087.         if(count>max)
  1088.             break;
  1089.         if(col) {
  1090.             col = 0;
  1091.             tputc('\n');
  1092.         } else
  1093.             col = 1;
  1094.     }
  1095.     if(col)
  1096.         tputc('\n');
  1097.     tputc('\n');
  1098.     return 0;
  1099. }
  1100.   
  1101. int
  1102. dombmailstats(argc,argv,p)
  1103. int argc;
  1104. char *argv[];
  1105. void *p;
  1106. {
  1107.     tprintf("Core: %lu\n"
  1108.     "Up: %s\n"
  1109.     "Logins: %d\n"
  1110.     "Users: %d\n"
  1111.     "Count: %d\n",
  1112.     farcoreleft(),tformat(secclock()),Totallogins,BbsUsers,DiffUsers);
  1113.   
  1114. #ifdef MAILCMDS
  1115. #ifdef MBFWD
  1116.     tprintf("Sent: %d\n"
  1117.     "Read: %d\n"
  1118.     "Rcvd: %d\n"
  1119.     "Fwd: %d\n\n",\
  1120.     MbSent,MbRead,MbRecvd,MbForwarded);
  1121. #else
  1122.     tprintf("Sent: %d\n"
  1123.     "Read: %d\n"
  1124.     "Rcvd: %d\n\n",MbSent,MbRead,MbRecvd);
  1125. #endif
  1126. #endif
  1127.     return 0;
  1128. }
  1129.   
  1130. #ifdef USERLOG
  1131.   
  1132. /* Search for info on a certain user in the users.dat file */
  1133. int
  1134. dombuserinfo(argc,argv,p)
  1135. int argc;
  1136. char *argv[];
  1137. void *p;
  1138. {
  1139.     FILE *Ufile;
  1140.     char buf[MBXLINE];
  1141.     int found = 0;
  1142.     time_t t;
  1143.     struct tm *lt;
  1144.     char *cp;
  1145.     char *cp2;
  1146.     char *cp3;
  1147.   
  1148.     char *username = NULL;
  1149.     char *homebbs = NULL;
  1150.     char *IPemail = NULL;
  1151.   
  1152.     cp3 = "TELNET";
  1153.   
  1154.     if((Ufile = fopen(UDefaults,"r")) == NULLFILE) {
  1155.         tputs("Can't find user data\n");
  1156.         return 0;
  1157.     }
  1158.   
  1159.     while(!found) {
  1160.         if(fgets(buf,sizeof(buf),Ufile) == NULLCHAR)
  1161.             break;
  1162.          /* single out the name */
  1163.         if((cp=strchr(buf,' ')) != NULLCHAR)
  1164.             *cp++ = '\0';
  1165.          /* compare the name */
  1166.         if(!stricmp(argv[1],buf)) {
  1167.             /* found user, now scan the options used */
  1168.             found = 1;
  1169.             /* read last login time */
  1170.             t = atol(cp);
  1171.             lt = localtime(&t);
  1172.             while(*cp != '\0') {
  1173.                 while(*cp == ' ')   /*skip blanks*/
  1174.                     cp++;
  1175.                 switch(*cp){
  1176.                     case 'C':
  1177.                         cp++;
  1178.                     switch(*cp){
  1179.                         /* All options end BEFORE the CT/CN or CA */
  1180.                         case 'A':
  1181.                             cp3 = "AX.25";
  1182.                             break;
  1183.                         case 'N':
  1184.                             cp3 = "NETROM";
  1185.                             break;
  1186.                     }
  1187.                         *(cp+1) = '\0';
  1188.                         break;
  1189.                     case '-':
  1190.                         cp++;
  1191.                     switch(*cp){
  1192.                         case 'h':
  1193.                             cp++;
  1194.                             cp2 = cp;
  1195.                             while(*cp != ' ')   /*skip blanks*/
  1196.                                 cp++;
  1197.                             *cp = '\0';
  1198.                             free(homebbs);
  1199.                             homebbs = strdup(cp2);
  1200.                             break;
  1201.                         case 'e':
  1202.                             cp++;
  1203.                             cp2 = cp;
  1204.                             while(*cp != ' ')   /*skip blanks*/
  1205.                                 cp++;
  1206.                             *cp = '\0';
  1207.                             free(IPemail);
  1208.                             IPemail = strdup(cp2);
  1209.                             break;
  1210.                         case 'n':
  1211.                             cp++;
  1212.                             cp2 = cp;
  1213.                             while(*cp != ' ')   /*skip blanks*/
  1214.                                 cp++;
  1215.                             *cp = '\0';
  1216.                             free(username);
  1217.                             username = strdup(cp2);
  1218.                             break;
  1219.                     }
  1220.                         break;
  1221.                 }
  1222.                 cp++;
  1223.             }
  1224.   
  1225.             tprintf("%s last connected via %s on %s",argv[1],cp3,asctime(lt));
  1226.             if(username  && (IPemail || homebbs)) {
  1227.                 tprintf("%s can be reached at:\n",username);
  1228.                 if(homebbs)
  1229.                     tprintf("AX.25 BBS: %s\n", homebbs);
  1230.                 if(IPemail)
  1231.                     tprintf("Internet:  %s\n", IPemail);
  1232.             }
  1233.         } /* while(!found)*/
  1234.     }
  1235.     if(!found)
  1236.         tprintf("%s never connected\n",argv[1]);
  1237.   
  1238.     fclose(Ufile);
  1239.     return 0;
  1240. }
  1241.   
  1242. #endif
  1243.   
  1244. int
  1245. dombusers(argc,argv,p)
  1246. int argc;
  1247. char *argv[];
  1248. void *p;
  1249. {
  1250.     struct mbx *m,*caller;
  1251.     int len;
  1252.     char *cp, *cp1, fsocket[MAXSOCKSIZE];
  1253.     char upl[40], down[40];
  1254.   
  1255.     struct usock *up, *up1;
  1256.     int s;
  1257.   
  1258. #ifdef NETROM
  1259.     struct nrroute_tab *np;
  1260.     char temp[AXBUF], *cp2, *cp3;
  1261. #endif
  1262.   
  1263.     caller = (struct mbx *) p;
  1264.   
  1265.     if(caller->stype == 'S')
  1266.         return dombmailstats(argc,argv,p);
  1267.   
  1268. #ifdef MAILCMDS
  1269.     if(((caller->stype == 'M') || (caller->stype == 'C')) &&
  1270.         (caller->privs & SYSOP_CMD))
  1271.         return dombmovemail(argc,argv,p);
  1272. #endif
  1273.   
  1274.     if(caller->stype == 'L')
  1275. #ifdef USERLOG
  1276.         if((argc > 1) && (atoi(argv[1]) == 0))
  1277.             return dombuserinfo(argc,argv,p);
  1278.         else
  1279. #endif
  1280.             return dombpast(argc,argv,p);
  1281.   
  1282.     tputs("Users:\n");
  1283.   
  1284.     for(m=Mbox;m;m=m->next) {
  1285.         len = MAXSOCKSIZE;
  1286.         getpeername(m->user,fsocket,&len);
  1287.         cp = strdup(psocket(fsocket));
  1288.   
  1289.         upl[0] = '\0';
  1290.         down[0] = '\0';
  1291.   
  1292.         switch(m->family) {     /* UPLINK */
  1293. #ifdef AX25
  1294.             case AF_AX25:
  1295.                 sprintf(upl,Uplink,cp);
  1296.                 break;
  1297. #endif
  1298. #ifdef NETROM
  1299.             case AF_NETROM:
  1300.                 if((cp1 = strchr(cp,' ')) != NULLCHAR)
  1301.                     *cp1 = '\0';
  1302.                 cp1 += 3;
  1303.                 setcall(temp,cp1);
  1304.                 np = find_nrroute(temp);
  1305.                 cp2 = strdup(np->alias);
  1306.                 if((cp3 = strchr(cp2,' ')) != NULLCHAR)
  1307.                     *cp3 = '\0';
  1308.     /*
  1309.         if(*cp2 == '#' || *cp2 == '\0')
  1310.         sprintf(upl,incircuit,"","",cp1,cp);
  1311.         else
  1312.      */
  1313.      /* show correct user name when outgoing forward over netrom
  1314.       * problem caused by use of the '.C xxx' lines.
  1315.       */
  1316.                 if(m->state == MBX_TRYING || m->state == MBX_FORWARD)
  1317.                     sprintf(upl,incircuit,cp2,":",cp1,m->name);
  1318.                 else
  1319.                     sprintf(upl,incircuit,cp2,":",cp1,cp);
  1320.                 free(cp2);
  1321.                 break;
  1322. #endif
  1323.             case AF_INET:
  1324.                 if((cp1 = strchr(cp,':')) != NULLCHAR)
  1325.                     *cp1 = '\0';
  1326.                 sprintf(upl,Telnet,m->name,cp);
  1327.                 break;
  1328.             case AF_LOCAL:
  1329.                 sprintf(upl,Local,(m->type==TIP_LINK) ? m->name : Hostname);
  1330.                 break;
  1331.             default:
  1332.                 strcpy(upl,"Connect");
  1333.                 break;
  1334.         }
  1335.         free(cp);
  1336.         tprintf("%-36s",upl);
  1337.   
  1338.     /* Now show what they are doing - WG7J */
  1339.         if(m->state != MBX_GATEWAY)
  1340.             tputs("  -> ");
  1341.         switch(m->state){
  1342.             case MBX_GATEWAY:
  1343.                 up1 = itop(m->user);
  1344.                 s = 0;
  1345.                 while((s=getnextsocket(s)) != -1) {
  1346.                     if(s == m->user || (up = itop(s)) == NULLUSOCK )
  1347.                         continue;
  1348.                     if(up->owner == up1->owner) {
  1349.                         getpeername(s,fsocket,&len);
  1350.                         cp = strdup(psocket(fsocket));
  1351.                         switch(up->type) {
  1352.                             case TYPE_TCP:
  1353.                                 sprintf(down,Telnetdown,cp);
  1354.                                 break;
  1355. #ifdef AX25
  1356.                             case TYPE_AX25I:
  1357.                                 sprintf(down,Downlink,cp);
  1358.                                 break;
  1359. #endif
  1360. #ifdef NETROM
  1361.                             case TYPE_NETROML4:
  1362.                     /*get rid of usercall*/
  1363.                                 if((cp1 = strchr(cp,' ')) != NULLCHAR)
  1364.                                     *cp1 = '\0';
  1365.                                 cp1 += 3;   /*get rid of ' @ '*/
  1366.                                 setcall(temp,cp1);      /*get node call*/
  1367.                                 np = find_nrroute(temp);/*find alias, if any*/
  1368.                                 cp2 = strdup(np->alias);
  1369.                                 if((cp3 = strchr(cp2,' ')) != NULLCHAR)
  1370.                                     *cp3 = '\0';
  1371.                                 sprintf(down,outcircuit,cp2,":",cp1);
  1372.                                 free(cp2);
  1373.                                 break;
  1374. #endif
  1375.                             case TYPE_LOCAL_STREAM:
  1376.                             case TYPE_LOCAL_DGRAM:
  1377.                                 sprintf(down,Local,Hostname);
  1378.                                 break;
  1379.                             default:
  1380.                                 strcpy(down,"Connect");
  1381.                                 break;
  1382.                         }
  1383.                         free(cp);
  1384.                         tprintf("<--> %s\n",down);
  1385.                         break;
  1386.                     }
  1387.                 }
  1388.                 break;
  1389.             case MBX_LOGIN:
  1390.                 tputs("Logging in\n");
  1391.                 break;
  1392.             case MBX_CMD:
  1393.                 tputs("Idle\n");
  1394.                 break;
  1395. #ifdef MAILCMDS
  1396.             case MBX_SUBJ:
  1397.             case MBX_DATA:
  1398.                 tputs("Sending message\n");
  1399.                 break;
  1400. #ifdef MBFWD
  1401.             case MBX_REVFWD:
  1402.                 tputs("Reverse Forwarding\n");
  1403.                 break;
  1404.             case MBX_TRYING:
  1405.                 tputs("Attempting Forward\n");
  1406.                 break;
  1407.             case MBX_FORWARD:
  1408.                 tputs("Forwarding\n");
  1409.                 break;
  1410. #endif
  1411.             case MBX_READ:
  1412.                 tputs("Reading message\n");
  1413.                 break;
  1414. #endif
  1415.             case MBX_UPLOAD:
  1416.                 tputs("Uploading file\n");
  1417.                 break;
  1418.             case MBX_DOWNLOAD:
  1419.                 tputs("Downloading file\n");
  1420.                 break;
  1421. #ifdef CONVERS
  1422.             case MBX_CONVERS:
  1423.                 tputs("Convers mode\n");
  1424.                 break;
  1425. #endif
  1426.             case MBX_CHAT:
  1427.                 tputs("Chatting with sysop\n");
  1428.                 break;
  1429.             case MBX_WHAT:
  1430.                 tputs("Listing files\n");
  1431.                 break;
  1432. #ifdef XMODEM
  1433.             case MBX_XMODEM_RX:
  1434.                 tputs("Xmodem Receiving\n");
  1435.                 break;
  1436.             case MBX_XMODEM_TX:
  1437.                 tputs("Xmodem Sending\n");
  1438.                 break;
  1439. #endif
  1440.         }
  1441.     /* Only show callers with sysop-privs who is sysop-mode!
  1442.      * This prevents users from easily learning who's
  1443.      * got SYSOP privs
  1444.      */
  1445.         if(m->state == MBX_SYSOPTRY) {
  1446.             if(caller->privs & SYSOP_CMD)
  1447.                 tputs("Attempting Sysop mode\n");
  1448.             else
  1449.                 tputs("Idle\n");
  1450.         } else {
  1451.             if(m->state == MBX_SYSOP) {
  1452.                 if(caller->privs & SYSOP_CMD)
  1453.                     tputs("Sysop mode\n");
  1454.                 else
  1455.                     tputs("Idle\n");
  1456.             }
  1457.         }
  1458.     }
  1459.     tputc('\n');
  1460.     return 0;
  1461. }
  1462.   
  1463. #ifdef MBFWD
  1464. static int
  1465. dombtrace(argc,argv,p)
  1466. int argc;
  1467. char *argv[];
  1468. void *p;
  1469. {
  1470.     return setbool(&Mtrace,"Mailbox trace flag",argc,argv);
  1471. }
  1472. #endif
  1473.   
  1474. static int
  1475. dombsecure(argc,argv,p)
  1476. int argc;
  1477. char *argv[];
  1478. void *p;
  1479. {
  1480.     return setbool(&MBSecure,"Mailbox gateway secure flag",argc,argv);
  1481. }
  1482.   
  1483. static int
  1484. dombnoax25(argc,argv,p)
  1485. int argc;
  1486. char *argv[];
  1487. void *p;
  1488. {
  1489.     return setflag(argc,argv[1],NO_AX25,argv[2]);
  1490. }
  1491.   
  1492. static int
  1493. dombbonly(argc,argv,p)
  1494. int argc;
  1495. char *argv[];
  1496. void *p;
  1497. {
  1498.     return setflag(argc,argv[1],BBS_ONLY,argv[2]);
  1499. }
  1500.   
  1501. static int
  1502. dombuonly(argc,argv,p)
  1503. int argc;
  1504. char *argv[];
  1505. void *p;
  1506. {
  1507.     return setflag(argc,argv[1],USERS_ONLY,argv[2]);
  1508. }
  1509.   
  1510. static int
  1511. dombsonly(argc,argv,p)
  1512. int argc;
  1513. char *argv[];
  1514. void *p;
  1515. {
  1516.     return setflag(argc,argv[1],SYSOP_ONLY,argv[2]);
  1517. }
  1518.   
  1519. #if defined USERLOG && defined REGISTER
  1520. int doregister(argc,argv,p)
  1521. int argc;
  1522. char *argv[];
  1523. void *p;
  1524. {
  1525.     FILE *fp;
  1526.     struct mbx *m = (struct mbx *) p;
  1527.   
  1528.     /* Is there a registration file? */
  1529.     if((fp = fopen(Mregfile,READ_TEXT)) != NULLFILE) {
  1530.         sendfile(fp,m->user,ASCII_TYPE,0,m);
  1531.         fclose(fp);
  1532.     }
  1533.   
  1534.     tprintf("Your current settings are:\nName = %s\n", (m->username == NULL) ? "Unknown": m->username);
  1535.     tprintf("AX.25 Homebbs Address  = %s\n", (m->homebbs == NULL) ? "Unknown" : m->homebbs);
  1536.     tprintf("Internet Email Address = %s\n\n", (m->IPemail == NULL) ? "Unknown" : m->IPemail);
  1537.   
  1538.     tputs("First name.(CR=cancel)\n");
  1539.     usflush(m->user);
  1540.     if(mbxrecvline(m) == 0)
  1541.         return 0;
  1542.     rip(m->line);
  1543.     free(m->username);
  1544.     m->username = strdup(m->line);
  1545.   
  1546.     tputs("AX.25 homebbs.(CR=cancel all)\n");
  1547.     usflush(m->user);
  1548.     if(mbxrecvline(m) == 0)
  1549.         return 0;
  1550.     rip(m->line);
  1551.     free(m->homebbs);
  1552.     m->homebbs = strdup(m->line);
  1553.     strupr(m->homebbs);
  1554.   
  1555.     tputs("Internet Email.(CR=ignore)\n");
  1556.     usflush(m->user);
  1557.     if(mbxrecvline(m) > 0) {
  1558.         rip(m->line);
  1559.         free(m->IPemail);
  1560.         m->IPemail = strdup(m->line);
  1561.     }
  1562.   
  1563.     log(m->user,"User %s - %s (AX.25 - %s) (Internet - %s) has registered.",
  1564.     m->name, m->username, m->homebbs,m->IPemail);
  1565. #ifdef notdef
  1566. /* save some dgroup space */
  1567.     if(m->username)
  1568.         tprintf("You (%s - %s) have specified:\n",m->name,m->username);
  1569.     if(m->homebbs)
  1570.         tprintf("%s as your AX.25 homebbs address\nand\n",m->homebbs);
  1571.     if(m->IPemail)
  1572.         tprintf("%s as your Internet email address.\n",m->IPemail);
  1573. /* The following should be part of the register message file */
  1574.     tputs("\nThanks for registering.\nPlease send a note to the sysop if you have any questions.\n");
  1575. #endif
  1576.     return 0;
  1577. }
  1578. #endif /* USERLOG && REGISTER */
  1579.   
  1580. char *cmd_line(int argc,char *argv[],char stype) {
  1581.     static char line[MBXLINE+1];
  1582.     int i;
  1583.     char *cp;
  1584.   
  1585.   
  1586.     cp = line;
  1587.     sprintf(cp,"%s ",argv[0]);
  1588.     cp+=strlen(cp);
  1589.     if(stype != ' ') {
  1590.         --cp;
  1591.         sprintf(cp,"%c ",stype);
  1592.         cp += 2;
  1593.     }
  1594.     for(i=1;i<argc;i++) {
  1595.         sprintf(cp,"%s ",argv[i]);
  1596.         cp += strlen(cp);
  1597.     }
  1598.     return line;
  1599. }
  1600.   
  1601. int MbShowAliases;
  1602.   
  1603. int dombshowalias(argc,argv,p)
  1604. int argc;
  1605. char *argv[];
  1606. void *p;
  1607. {
  1608.     return setbool(&MbShowAliases,"Show aliases in prompts",argc,argv);
  1609. }
  1610.   
  1611.   
  1612. #endif /* MAILBOX */
  1613.